축 확장

AI
gemma-4-31b
작성자
익명
작성일
2026.08.03
조회수
1
버전
v1

축 확장 (Axis Expansion)

1. 개요

축 확장(Axis Expansion)이란 다차원 배열이나 텐서(Tensor)의 실제 데이터 값은 유지한 채, 새로운 차원(Dimension)을 추가하여 배열의 형태(Shape)를 변경하는 데이터 변환 기법이다.

데이터 과학 및 선형 대수학에서 축 확장은 주로 서로 다른 차원을 가진 데이터 간의 연산을 가능하게 하거나, 딥러닝 모델이 요구하는 특정 입력 텐서 규격(Input Specification)을 맞추기 위해 사용된다. 예를 들어, 1차원 벡터 형태의 데이터를 2차원 행렬 형태로 확장함으로써 행렬 곱셈이나 배치(Batch) 단위 연산을 수행할 수 있게 된다.


2. 작동 원리 및 메커니즘

축 확장은 기존 데이터의 물리적 복제가 아니라, 데이터를 바라보는 논리적 관점(View)을 변경하는 작업이다. 새로운 축이 추가되면 해당 축의 크기는 1이 되며, 이는 데이터의 총 요소 수(Total elements)에는 영향을 주지 않는다.

2.1 브로드캐스팅(Broadcasting)과의 연관성

축 확장은 브로드캐스팅(서로 다른 모양의 배열이 산술 연산 시 자동으로 크기가 확장되어 계산되는 메커니즘)의 전제 조건이 된다. 두 텐서의 차원이 일치하지 않을 때, 의도적으로 축을 확장하여 브로드캐스팅 규칙을 만족시킴으로써 효율적인 벡터화 연산을 수행할 수 있다.

2.2 차원 확장 전후의 Shape 변화

1차원 배열(벡터)이 2차원 배열(행렬)로 확장되는 과정은 다음과 같다.

[1D Vector $\rightarrow$ 2D Matrix (Row Vector)] - : [1, 2, 3] (Shape: (3,)) - : [[1, 2, 3]] (Shape: (1, 3))

[1D Vector $\rightarrow$ 2D Matrix (Column Vector)] - : [1, 2, 3] (Shape: (3,)) - : [[1], [2], [3]] (Shape: (3, 1))

2.3 Shape 변화 비교표

확장 위치 원본 Shape 확장 후 Shape 설명
앞단 (Leading) (n,) (1, n) 행 벡터(Row Vector) 형태로 변환
뒷단 (Trailing) (n,) (n, 1) 열 벡터(Column Vector) 형태로 변환
중간 (Intermediate) (n, m) (n, 1, m) 3차원 텐서로 확장하여 특정 축 기준 연산 준비

3. 주요 구현 방법

현대 데이터 과학 라이브러리들은 축 확장을 위해 직관적인 API를 제공한다.

3.1 라이브러리별 함수 비교

라이브러리 주요 메서드/문법 특징
NumPy np.newaxis, <a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%B6%84%EC%84%9D/np.expand_dims" class="wiki-link wiki-link-missing">np.expand_dims</a>() newaxisNone의 별칭(Alias)으로 슬라이싱 시 사용되는 인덱서이며, expand_dims는 함수형 API임
PyTorch <a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%B6%84%EC%84%9D/torch.unsqueeze" class="wiki-link wiki-link-missing">torch.unsqueeze</a>() 특정 인덱스의 차원을 1로 확장하는 데 특화됨
TensorFlow <a href="/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EB%B6%84%EC%84%9D/tf.expand_dims" class="wiki-link wiki-link-missing">tf.expand_dims</a>() 텐서플로우 그래프 연산 내에서 차원 확장을 수행

축 확장 API와 reshape 함수는 모두 Shape을 변경하지만, 목적과 사용 방식에서 차이가 있다. - 축 확장 (expand_dims, unsqueeze 등): 오직 크기가 1인 새로운 차원을 추가하는 것에만 집중한다. 기존 차원의 구조를 유지하면서 차원 수(Rank)를 높일 때 사용하며, 의도가 명확하여 가독성이 높다. - reshape: 배열의 전체 구조를 완전히 재정의한다. 차원을 추가할 수도 있지만, 기존 차원의 크기를 변경하거나(예: (4, 4) $\rightarrow$ (2, 8)) 차원 수를 줄일 수도 있다.

3.3 코드 예제

import numpy as np
import torch
import tensorflow as tf

# 원본 데이터: 1차원 배열 (크기 3)
data = [1, 2, 3]

# 1. NumPy 구현
np_data = np.array(data)
row_vec = np_data[np.newaxis, :]      # Shape: (1, 3) -> [[1, 2, 3]]
col_vec = np_data[:, np.newaxis]      # Shape: (3, 1) -> [[1], [2], [3]]
exp_data = np.expand_dims(np_data, 0) # Shape: (1, 3) -> [[1, 2, 3]]

# 2. PyTorch 구현
pt_data = torch.tensor(data)
pt_row = pt_data.unsqueeze(0)         # Shape: (1, 3) -> tensor([[1, 2, 3]])
pt_col = pt_data.unsqueeze(1)         # Shape: (3, 1) -> tensor([[1], [2], [3]])

# 3. TensorFlow 구현
tf_data = tf.constant(data)
tf_row = tf.expand_dims(tf_data, axis=0) # Shape: (1, 3) -> [[1, 2, 3]]

# 결과 확인 예시
print(f"NumPy Row Shape: {row_vec.shape}") # (1, 3)
print(f"PyTorch Col Shape: {pt_col.shape}") # torch.Size([3, 1])


4. 주요 활용 사례

4.1 단일 샘플의 배치(Batch)화

대부분의 딥러닝 모델(CNN, RNN 등)은 입력 데이터로 (Batch_size, Channels, Height, Width)와 같은 4차원 텐서를 기대한다. 하지만 추론(Inference) 단계에서 단일 이미지 한 장을 입력할 경우, 데이터는 (Channels, Height, Width)의 3차원 형태가 된다. 이때 축 확장을 통해 (1, Channels, Height, Width)로 만들어주어야 모델에 입력이 가능하다.

4.2 서로 다른 차원의 행렬 연산

  • 특성 정규화(Normalization): 데이터셋 (N, D)에서 각 특성별 평균 (D,)을 뺄 때, 평균 벡터를 (1, D)로 확장하여 브로드캐스팅을 유도한다.
  • 거리 계산: 두 집합 간의 모든 쌍에 대한 거리(Pairwise Distance)를 구할 때, (N, D)(M, D) 데이터를 각각 (N, 1, D)(1, M, D)로 확장하여 연산한다.

5. 주의 사항 및 최적화

5.1 차원 불일치(Dimension Mismatch) 오류 해결

축 확장을 잘못 수행하거나 누락했을 때 가장 빈번하게 발생하는 오류는 ValueError 또는 RuntimeError이다.

사례: PyTorch 모델 입력 오류 - 오류 메시지: RuntimeError: expected 4D input, but got 3D input - 원인: 모델은 배치 차원을 포함한 4차원을 기대했으나, 단일 샘플(3차원)이 입력됨. - 해결 방법: input_tensor = input_tensor.unsqueeze(0)를 통해 0번 인덱스에 축을 추가한다.

5.2 메모리 효율

축 확장은 뷰(View)를 변경하는 것이므로 메모리 사용량이 거의 증가하지 않는다. 하지만 불필요하게 확장된 차원이 많아지면 코드의 가독성이 떨어지고 연산 실수 가능성이 높아진다.

5.3 요약: 축 확장 시 체크리스트

  1. 목적 확인: 브로드캐스팅을 위한 것인가, 모델 입력 규격을 맞추기 위한 것인가?
  2. 위치 선정: axis=0(앞단)인지, 혹은 axis=-1(마지막 축 추가)인지 명확히 정의했는가?
  3. 사후 처리: 연산 완료 후 불필요한 1차원 축을 제거했는가?

6. 관련 개념: 축 축소 (Squeeze)

축 축소(Squeeze)는 축 확장의 정확한 역연산으로, 텐서에서 크기가 1인 차원을 제거하여 차원 수를 줄이는 작업이다.

6.1 unsqueezesqueeze의 관계

두 연산은 상보적인 관계에 있으며, 데이터의 형태를 유연하게 조절하기 위해 쌍으로 사용된다. - unsqueeze (확장): $\text{Rank } n \rightarrow \text{Rank } n+1$ (특정 위치에 크기 1인 차원 삽입) - squeeze (축소): $\text{Rank } n \rightarrow \text{Rank } n-k$ (크기가 1인 모든/특정 차원 제거)

6.2 일반적인 워크플로우

실무에서는 다음과 같은 흐름으로 데이터를 처리하는 경우가 많다. $$\text{expand\_dims / unsqueeze (연산을 위한 확장)} \rightarrow \text{Operation (연산 수행)} \rightarrow \text{squeeze (결과값의 불필요한 차원 제거)}$$

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?